"""
可变数据类型：list/dict/set，值改变，内存地址不会改变。总结意思就是，程序允许该内存地址的值发生改变。
不可变数据类型，number/str/tuple/bool, 程序不允许，内存地址对应的值发生改变，一个值，只能对应一个内存地址
"""

"""
首先，我们需要明确以下规则：

变量不存储值，只存储值对应的内存地址
数据一旦被声明，就会确定其内存地址，每个值都会有其对应的内存地址
dict/list/set，这三种数据类型声明时，尽管长得一样，也会重新申请内存地址
"""

# i = 1  # 值是 1 的内存地址
# p = 1
# o = p
# print(id(1))
# print(id(i))
# print(id(p))
# print(id(o))
# p = 2
# print(id(p))

# 这里面存用例
# lst1 = []  # 100
# # 这里面存结果
# lst2 = []  # 100
# lst1.append(1)
# lst2.append(2)

# print(id(lst1))
# print(id(lst2))
#
# lst1.append(1)
# lst2.append(2)
#
# print(lst1)
# print(id(lst1))
# print(lst2)
# print(id(lst2))


# 变量赋值的本质：引用，引用的是内存地址

# i = 1  # 是将1的内存地址给了i
# p = i  # 是将i的内存地址给了p
#
# print(id(i))
# print(id(p))

# lst1 = []
# lst2 = lst1
#
# print(id(lst1))
# print(id(lst2))
#
# lst1.append(1)
#
# print(lst1)
# print(lst2)
#
# lst2.append(2)
#
# print(lst1)
# print(lst2)

# 里面放着是学生信息
classmete = []

classes = {
    "name": "三年二班",
    "classmete": classmete
}

print(id(classmete))
print(id(classes['classmete']))

classmete.append({
    "name": "张三",
    "age": 18
})

classmete.append({
    "name": "李四",
    "age": 20
})

print(classmete)  # 老师看的
print(classes)  # 教导主任/校长看的